package com.atguigu.test.context;

import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.support.DefaultListableBeanFactory;
import org.springframework.context.support.ClassPathXmlApplicationContext;

/**
 * @author zp
 * @version 1.0
 * @description: 自定义注解的容器
 * @date 2022/12/3 14:26
 */
@Slf4j
public class MyApplicationContext extends ClassPathXmlApplicationContext {

    public MyApplicationContext(String configLocation) throws BeansException {
        super(configLocation);
    }
    /**
     * @description:  初始化属性来源
     * 默认是空实现 可以添加修改环境对象里面的环境属性值
     * 也可以添加校验或者修改环境对象里面包含的系统属性值 来达到对环境的校验
     * initPropertySources的作用：
     * 设置要求的属性 可以检查前面加载的环境变量和系统属性 是否符合运行程序的要求
     * 就比如 spring-mvc WebApplicationContextUtils 容器校验加载参数当中是否含义
     * servletContextInitParams和servletConfigInitParams 两个系统变量参数 如果没有启动直接失败
     * @author zp
     * @date: 2022/12/3 14:55
     */
    @Override
    protected void initPropertySources() {
        log.info("扩展属性值 initPropertySources 》》》》 方法开始调用");
        String username = getEnvironment().getProperty("username");
        log.info("获取 username 属性变量的值：[{}]",username);
        getEnvironment().setRequiredProperties("username");
        log.info("扩展属性值 initPropertySources 》》》》方法结束调用");
    }
    /**
     * @description:  customizeBeanFactory方法说明：
     * AllowBeanDefinitionOverriding 和 AllowCircularReferences 父类默认为true 子类为null
     * setAllowBeanDefinitionOverriding：
     * 先判断是否为空 设置给beanFactory 对象的相应的属性 是否运行覆盖同名称的不同定义的对象
     * setAllowCircularReferences：
     * 先判断是否为空 设置给beanFactory 对象的相应的属性 是否运行bean直接存在循环依赖
     * @author zp
     * @date: 2022/12/3 15:41
     * @param beanFactory
     */
    @Override
    protected void customizeBeanFactory(DefaultListableBeanFactory beanFactory) {
        log.info("定制beanFactory customizeBeanFactory 》》》》 方法开始调用");
        beanFactory.setAllowBeanDefinitionOverriding(true);
        // 禁用循环依赖 这里可以禁用循环依赖
        beanFactory.setAllowCircularReferences(false);
        super.customizeBeanFactory(beanFactory);
        log.info("定制beanFactory customizeBeanFactory 》》》》 方法结束调用");
    }
}
